package com.example;

/**
 * 将这些Runnable对象作为某一个类中的内部类，共享数据作为这个外部类中的成员变量或局部变量，
 * 每个线程对共享数据的操作方法也分配给外部类，以便实现对共享数据进行的各个操作的互斥和通信，
 * 作为内部类的各个Runnable对象调用外部类的这些方法
 * 总之，要同步互斥的几段代码最好是分别放在几个独立的方法中，这些方法再放在同一个类中，
 * 这样比较容易实现它们之间的同步互斥和通信
 */
public class MultiThreadShareData2 {
    public static void main(String[] args) {
        //共享数据作为这个外部类中的成员变量或局部变量
        final ShareData2 data = new ShareData2();
        new Thread(
                //将这些Runnable对象作为某一个类中的内部类
                new Runnable() {
                    @Override
                    public void run() {
                        data.decrement();
                    }
                }
        ).start();
        new Thread(
                //将这些Runnable对象作为某一个类中的内部类
                new Runnable() {
            @Override
            public void run() {
                data.increment();
            }
        }).start();
    }
}

//每个线程对共享数据的操作方法也分配给外部类
class ShareData2 {
    private int j = 0;

    public void increment() {
        j++;
        System.out.println(j);
    }

    public void decrement() {
        j--;
        System.out.println(j);
    }
}
